﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DAL;

namespace BLL
{
    public class HoaDonBanBUO:IBUO<tbl_HoaDonBan>
    {
        CSDLBanHangDataContext context=new CSDLBanHangDataContext();
        public bool Insert(tbl_HoaDonBan obj)
        {
            try
            {
                context.tbl_HoaDonBans.InsertOnSubmit(obj);
                context.SubmitChanges();
                return true;
            }
            catch (Exception)
            {

                return false;
            }
        }

        public bool Delete(String id)
        {
            try
            {
                tbl_HoaDonBan obj = context.tbl_HoaDonBans.Where(n => n.id_HoaDonBan.Equals(id)).ToList<tbl_HoaDonBan>().FirstOrDefault();
                if (obj != null)
                {
                    context.tbl_HoaDonBans.DeleteOnSubmit(obj);
                    context.SubmitChanges();
                    return true;
                }
                else
                {
                    return false;
                }
            }
            catch (Exception)
            {

                return false;
            }
        }

        public bool Delete(tbl_HoaDonBan obj)
        {
            throw new NotImplementedException();
        }

        public List<tbl_HoaDonBan> GetAll()
        {
            return context.tbl_HoaDonBans.OrderByDescending(n => n.id_HoaDonBan).ToList<tbl_HoaDonBan>();
        }

        public tbl_HoaDonBan GetSingle(String id)
        {
            throw new NotImplementedException();
        }

        public bool Update(String id, tbl_HoaDonBan obj)
        {
            throw new NotImplementedException();
        }
        
        /// <summary>
        /// Tìm kiếm hàng hóa trong chi tiết hóa đơn bán bằng mã hàng hóa
        /// </summary>
        /// <param name="idHangHoa"></param>
        /// <returns></returns>
        public IQueryable SearchHangHoaTrongChiTietHDBanByIDHangHoa(String idHangHoa)
        {
            var list = context.tbl_HoaDonBans.Join(
                context.tbl_NhanViens,
                a => a.id_NhanVien,
                b => b.id_NhanVien,
                (a, b) => new
                {
                    id_HoaDonBan = a.id_HoaDonBan,
                    id_NhanVien = a.id_NhanVien,
                    id_Khach = a.id_Khach,
                    TenNhanVien = b.TenNhanVien,
                    NgayBan = a.NgayBan
                }
                ).Join(
                context.tbl_Khaches,
                c => c.id_Khach,
                d => d.id_Khach,
                (c, d) => new
                {
                    id_HoaDonBan = c.id_HoaDonBan,
                    id_NhanVien = c.id_NhanVien,
                    TenKhach = d.TenKhach,
                    TenNhanVien = c.TenNhanVien,
                    NgayBan = c.NgayBan
                }
                ).Join(
                context.tbl_HoaDonBan_Hangs,
                f => f.id_HoaDonBan,
                g => g.id_HoaDonBan,
                (f, g) => new
                {
                    id_HoaDonBan = f.id_HoaDonBan,
                    id_Hang = g.id_Hang,
                    id_NhanVien = f.id_NhanVien,
                    TenKhach = f.TenKhach,
                    TenNhanVien = f.TenNhanVien,
                    SoLuong = g.SoLuong,
                    NgayBan = f.NgayBan
                }
                ).Join(
                context.tbl_Hangs,
                h => h.id_Hang,
                k => k.id_Hang,
                (h, k) => new
                {
                    id_HoaDonBan = h.id_HoaDonBan,
                    id_Hang = h.id_Hang,
                    id_NhanVien = h.id_NhanVien,
                    TenHang = k.TenHang,
                    TenKhach = h.TenKhach,
                    TenNhanVien = h.TenNhanVien,
                    SoLuong = h.SoLuong,
                    NgayBan = h.NgayBan
                }

                ).Where(n => n.id_Hang.Contains(idHangHoa));
            return list;
        }
        /// <summary>
        /// Tìm kiếm hàng hóa trong chi tiết hóa đơn bán hàng theo tên hàng hóa
        /// </summary>
        /// <param name="TenHang"></param>
        /// <returns></returns>
        public IQueryable SearchHangHoaTrongChiTietHDBanByTenHang(String TenHang)
        {
            var list = context.tbl_HoaDonBans.Join(
                context.tbl_NhanViens,
                a => a.id_NhanVien,
                b => b.id_NhanVien,
                (a, b) => new
                {
                    id_HoaDonBan = a.id_HoaDonBan,
                    id_NhanVien = a.id_NhanVien,
                    id_Khach = a.id_Khach,
                    TenNhanVien = b.TenNhanVien,
                    NgayBan = a.NgayBan
                }
                ).Join(
                context.tbl_Khaches,
                c => c.id_Khach,
                d => d.id_Khach,
                (c, d) => new
                {
                    id_HoaDonBan = c.id_HoaDonBan,
                    id_NhanVien = c.id_NhanVien,
                    TenKhach = d.TenKhach,
                    TenNhanVien = c.TenNhanVien,
                    NgayBan = c.NgayBan
                }
                ).Join(
                context.tbl_HoaDonBan_Hangs,
                f => f.id_HoaDonBan,
                g => g.id_HoaDonBan,
                (f, g) => new
                {
                    id_HoaDonBan = f.id_HoaDonBan,
                    id_Hang = g.id_Hang,
                    id_NhanVien = f.id_NhanVien,
                    TenKhach = f.TenKhach,
                    TenNhanVien = f.TenNhanVien,
                    SoLuong = g.SoLuong,
                    NgayBan = f.NgayBan
                }
                ).Join(
                context.tbl_Hangs,
                h => h.id_Hang,
                k => k.id_Hang,
                (h, k) => new
                {
                    id_HoaDonBan = h.id_HoaDonBan,
                    id_Hang = h.id_Hang,
                    id_NhanVien = h.id_NhanVien,
                    TenHang = k.TenHang,
                    TenKhach = h.TenKhach,
                    TenNhanVien = h.TenNhanVien,
                    SoLuong = h.SoLuong,
                    NgayBan = h.NgayBan
                }

                ).Where(n => n.TenHang.Contains(TenHang));
            return list;
        }
        /// <summary>
        /// Hiển thị danh sách hóa đơn bán
        /// </summary>
        /// <returns></returns>
        public IQueryable ShowHoaDonBan()
        {
            var list = context.tbl_HoaDonBans.Join(
                context.tbl_NhanViens,
                a => a.id_NhanVien,
                b => b.id_NhanVien,
                (a, b) => new
                {
                    id_HoaDonBan=a.id_HoaDonBan,
                    id_Khach = a.id_Khach,
                    TenNhanVien = b.TenNhanVien,
                    NgayBan = a.NgayBan
                }
                ).Join(
                context.tbl_Khaches,
                c => c.id_Khach,
                d => d.id_Khach,
                (c, d) => new
                {
                    id_HoaDonBan=c.id_HoaDonBan,
                    TenKhach=d.TenKhach,
                    TenNhanVien=c.TenNhanVien,
                    NgayBan=c.NgayBan
                }
                ).OrderByDescending(p=>p.id_HoaDonBan);
            return list;
        }
        /// <summary>
        /// Tìm hóa đơn theo mã hóa đơn bán
        /// </summary>
        /// <param name="ma"></param>
        /// <returns></returns>
        
        public IQueryable SearchByMaHDBan(String ma)
        {
            var list = context.tbl_HoaDonBans.Join(
                context.tbl_NhanViens,
                a => a.id_NhanVien,
                b => b.id_NhanVien,
                (a, b) => new
                {
                    id_HoaDonBan = a.id_HoaDonBan,
                    id_Khach = a.id_Khach,
                    TenNhanVien = b.TenNhanVien,
                    NgayBan = a.NgayBan
                }
                ).Join(
                context.tbl_Khaches,
                c => c.id_Khach,
                d => d.id_Khach,
                (c, d) => new
                {
                    id_HoaDonBan = c.id_HoaDonBan,
                    TenKhach = d.TenKhach,
                    TenNhanVien = c.TenNhanVien,
                    NgayBan = c.NgayBan
                }
                ).Where(p => p.id_HoaDonBan.ToLower().Contains(ma.ToLower().Trim()));
            return list;
        }

        /// <summary>
        /// Tìm kiếm hóa đơn theo tên khách hàng
        /// </summary>
        /// <param name="khach"></param>
        /// <returns></returns>
        public IQueryable SearchByKhach(String khach)
        {
            var list = context.tbl_HoaDonBans.Join(
                context.tbl_NhanViens,
                a => a.id_NhanVien,
                b => b.id_NhanVien,
                (a, b) => new
                {
                    id_HoaDonBan = a.id_HoaDonBan,
                    id_Khach = a.id_Khach,
                    TenNhanVien = b.TenNhanVien,
                    NgayBan = a.NgayBan
                }
                ).Join(
                context.tbl_Khaches,
                c => c.id_Khach,
                d => d.id_Khach,
                (c, d) => new
                {
                    id_HoaDonBan = c.id_HoaDonBan,
                    TenKhach = d.TenKhach,
                    TenNhanVien = c.TenNhanVien,
                    NgayBan = c.NgayBan
                }
                ).Where(p => p.TenKhach.Contains(khach));
            return list;
        }
        /// <summary>
        /// Tìm kiếm hóa đơn theo ngày tháng
        /// </summary>
        /// <param name="ngay"></param>
        /// <returns></returns>
        public IQueryable SearchByNgayThang(String ngay)
        {
            
            var list = context.tbl_HoaDonBans.Join(
                context.tbl_NhanViens,
                a => a.id_NhanVien,
                b => b.id_NhanVien,
                (a, b) => new
                {
                    id_HoaDonBan = a.id_HoaDonBan,
                    id_Khach = a.id_Khach,
                    TenNhanVien = b.TenNhanVien,
                    NgayBan = a.NgayBan
                }
                ).Join(
                context.tbl_Khaches,
                c => c.id_Khach,
                d => d.id_Khach,
                (c, d) => new
                {
                    id_HoaDonBan = c.id_HoaDonBan,
                    TenKhach = d.TenKhach,
                    TenNhanVien = c.TenNhanVien,
                    NgayBan = c.NgayBan
                }
                ).Where(p => p.NgayBan.Equals(ngay));
            return list;
        }
    }
}
